Skip to content

docs(infra): design Compass self-host runner + adoption strategy (RIG-3070) - #804

Open
rigel-mintaka wants to merge 1 commit into
mainfrom
compass-obs/rig-3070-runner-adoption-strategy
Open

docs(infra): design Compass self-host runner + adoption strategy (RIG-3070)#804
rigel-mintaka wants to merge 1 commit into
mainfrom
compass-obs/rig-3070-runner-adoption-strategy

Conversation

@rigel-mintaka

@rigel-mintaka rigel-mintaka commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Documents Matt's ruled self-host runner topology and adoption strategy as a frozen-on-merge contract in a new design record under docs/designs/infra/runtime/compass-runner-adoption-strategy/. Mints DL-325.

What this record freezes

The security boundary follows the trust model, not the deployment uniformly (Matt, 2026-08, amended 2026-08-31):

  • Untrusted multi-tenant operation = microVM-only. Running code from mutually-distrusting tenants needs the KVM hardware-isolation boundary; microVM (cloud-hypervisor/KVM) is required there. The frozen corpus already fixes that end state (microvm-runner.md:403-405); this record scopes that end state to the untrusted-multi-tenant trust model.
  • Self-host single-tenant = podman is a permanent, supported entry tier, requiring no /dev/kvm — it runs on any cheap VPS or box. A self-host operator runs their own agents on their own code on their own box, so there is no untrusted tenant to isolate and the KVM boundary is optional. microVM is the recommended (not required) self-host upgrade, for defense-in-depth or an operator who runs untrusted code or shares the box. This amends the frozen KVM-only amendment with a self-host carve-out, honestly flagged as reopening a frozen decision, and distinguished from the amendment's own already-rejected carve-out (which was about the untrusted-multi-tenant boundary, not this single-tenant case).
  • Embedded-local is REVIVED as the cross-OS developer front door. With podman permanent for self-host, a developer's own laptop is the single-tenant case in its purest form (no untrusted tenant to isolate), so embedded-local is legitimate: install the app, launch, sign in with your own Claude Code / Codex subscription, and go. This record records the direction only; the app-architecture reversal (un-retiring compass-app's supervisor invocation / embedded config arm / bundle, reversing DL-235's client-only charter) is designed in the compass-native lane's embedded-revival record.
  • The always-on-server argument survives as the graduation motivation, not an argument against embedded. The funnel is embedded-local (front door, your box) → self-host stack (always-on, dedicated box/VPS) → the hosted service. "Dual runtimes" here means the two existing SelectBackend stack backends (podman + microVM), both already shipping — embedded-local runs the same podman backend locally, not a third runtime.
  • macOS: podman-machine is the Mac embedded-local front-door path and a permanent Mac self-host option (no nested virt, any Mac); microVM-on-Mac stays nested-only/unsupported; the remote-Linux client path (DL-235-era) stands.

Relationship to the frozen corpus

The ruling ratifies one frozen record, records the deferred reversal of a second, and amends a third:

  • DL-259 stands — the self-host microVM stack remains a host-level KVM bring-up, no compose/Swarm packaging. The podman carve-out adds a tier beside it, it does not repackage the KVM stack.
  • DL-235 is being reversed — its client-only charter retired embedded supervision; under the 2026-08-31 embedded-revival ruling that reversal is designed in the compass-native lane's record. This record records only the topology direction that motivates it.
  • The KVM-only amendment is amended with a self-host carve-out — its no-fallback posture is ratified for untrusted multi-tenant operation and amended for self-host single-tenant, where podman is a first-class permanent runtime choice, not a lesser boundary imposed on an unwitting tenant. This carve-out is the net-new ruling in the record.

Scope boundary

How a hosted multi-tenant service adopts, sequences, and deploys the microVM-only boundary is a managed-plane concern and is out of scope for this public OSS record (docs/concepts/self-host-and-managed.md). This record carries the core capability and the self-host/embedded adoption strategy only.

Tasks (filed at freeze)

  • T1 — microVM production-readiness bar (OQ-1) frozen. The microVM-only pinning path and the podman/microVM preflight split have already landed in the runtime lane (verifyBackendPreflight over VerifyMicroVMSupport; compass-stack preflight hostcheck split) — consumed here, not built here; podman backend retained permanently for self-host. Owner: compass-runner.
  • T2 — guided self-host onboarding guide, opening with the embedded-local front door, then both self-host graduation paths (podman entry tier, recommended microVM upgrade). Owner: distribution/docs lane.

The embedded app-architecture reversal is deliberately NOT a task here — it is the compass-native lane's record. OQ-1 (microVM readiness bar), OQ-2 (VPS provider pick), OQ-3 (macOS podman-machine socket spike) are deferred and non-freeze-blocking.

Ledger-impact: mints DL-325 in docs/designs/DECISIONS.md.
Spec-impact: none (design record; the runner-topology spec follows the impl tasks post-freeze).
Refs RIG-3070

Co-authored-by: Matt Wilkinson matt@rigel.build

@linear-code

linear-code Bot commented Aug 31, 2026

Copy link
Copy Markdown

RIG-3070

@github-actions

github-actions Bot commented Aug 31, 2026

Copy link
Copy Markdown

@rigel-mintaka
rigel-mintaka force-pushed the compass-obs/rig-3070-runner-adoption-strategy branch from f4f27c2 to 650c699 Compare August 31, 2026 19:47
@rigel-mintaka
rigel-mintaka marked this pull request as ready for review August 31, 2026 19:47
@rigel-mintaka
rigel-mintaka marked this pull request as draft August 31, 2026 23:21
@rigel-mintaka
rigel-mintaka force-pushed the compass-obs/rig-3070-runner-adoption-strategy branch 2 times, most recently from 30a299d to 99722b5 Compare September 1, 2026 04:13
@rigel-mintaka
rigel-mintaka force-pushed the compass-obs/rig-3070-runner-adoption-strategy branch from 99722b5 to 43fb66c Compare September 1, 2026 05:06
@rigel-mintaka
rigel-mintaka marked this pull request as ready for review September 1, 2026 05:07
@rigel-mintaka
rigel-mintaka marked this pull request as draft September 2, 2026 20:29
rigel-mintaka added a commit that referenced this pull request Sep 2, 2026
…sh macOS (RIG-3139)

Designs the reversal of the RIG-2542 client-only retirement: mode="embedded" returns to the Compass native app as the low-friction onboarding / local-dev front door, ADDED ALONGSIDE the fully-surviving client mode. The retirement's premise (the microVM Runner's KVM floor retiring local agent execution) is falsified now that podman is a permanent supported single-tenant tier per the trust-model boundary (DL-318, compass-obs #804). Covers the mode-selection contract, supervisor re-wire against the current stack, cross-OS preflight, bundle re-scope (sidecars return, postgres stays a DL-260 container), the macOS podman-machine provisioning spike, and the UI embedded boot arm.

Records the record on the ui/ design path (RIG-3113 dissolved product/ into ui/) and lands the ledger delta in DECISIONS.md: new rows DL-319 (dual-mode thesis), DL-320 (dual-mode app.toml), DL-321 (sidecar bundle sans postgres); status flips DL-235/237/238 → Superseded by DL-319/320/321. DL-236's standalone-compass-stack half stays Active.

Folds Matt's freeze-gate topology + backend feedback: the §Topology matrix separates the two independent axes (app mode: embedded/client; runner backend: podman/microVM) and records the recommended backend per funnel entry — embedded-local is podman-primary (macOS cannot do microVM; WSL2 has no KVM out of the box), self-host is microVM-recommended with podman the cost-sensitive tier, managed is microVM. Scrubs managed-hosted to the trust-model boundary only, with an OSS-core scope note keeping product-strategy specifics out of this repo. Adds three load-bearing open questions with recommendations for Matt's gate: OQ-9 (docker socket vs force-podman — force-podman: the --userns=keep-id:uid= isolation boundary is podman-specific), OQ-10 (apple/container as a macOS backend — defer: macOS-26 + Apple-silicon-only, pre-1.0), OQ-11 (embedded microVM on Linux — v1 container-only, follow-up). Also folds the prior review passes' podman-version FATAL preflight (delta 4, OQ-8) and the doc-comment reconciliations.

Refs RIG-3139
Spec-impact: adds the embedded-mode revival design record (Draft) under docs/designs/ui/
Ledger-impact: DL-319/320/321 added; DL-235/237/238 flipped to Superseded
Co-authored-by: Matt Wilkinson <matt@rigel.build>
@rigel-mintaka
rigel-mintaka changed the base branch from main to compass-obs/managed-boundary-naming-rule September 2, 2026 21:27
@rigel-mintaka
rigel-mintaka force-pushed the compass-obs/rig-3070-runner-adoption-strategy branch from 43fb66c to d33fa75 Compare September 2, 2026 21:27
rigel-mintaka added a commit that referenced this pull request Sep 2, 2026
…sh macOS (RIG-3139)

Designs the reversal of the RIG-2542 client-only retirement: mode="embedded" returns to the Compass native app as the low-friction onboarding / local-dev front door, ADDED ALONGSIDE the fully-surviving client mode. The retirement's premise (the microVM Runner's KVM floor retiring local agent execution) is falsified now that podman is a permanent supported single-tenant tier per the trust-model boundary (DL-318, compass-obs #804). Covers the mode-selection contract, supervisor re-wire against the current stack, cross-OS preflight, bundle re-scope (sidecars return, postgres stays a DL-260 container), the macOS podman-machine provisioning spike, and the UI embedded boot arm.

Records the record on the ui/ design path (RIG-3113 dissolved product/ into ui/) and lands the ledger delta in DECISIONS.md: new rows DL-319 (dual-mode thesis), DL-320 (dual-mode app.toml), DL-321 (sidecar bundle sans postgres); status flips DL-235/237/238 → Superseded by DL-319/320/321. DL-236's standalone-compass-stack half stays Active.

Folds Matt's freeze-gate topology + backend feedback: the §Topology matrix separates the two independent axes (app mode: embedded/client; runner backend: podman/microVM) and records the recommended backend per funnel entry — embedded-local is podman-primary (macOS cannot do microVM; WSL2 has no KVM out of the box), self-host is microVM-recommended with podman the cost-sensitive tier, managed is microVM. Scrubs managed-hosted to the trust-model boundary only, with an OSS-core scope note keeping product-strategy specifics out of this repo. Adds three load-bearing open questions with recommendations for Matt's gate: OQ-9 (docker socket vs force-podman — force-podman: the --userns=keep-id:uid= isolation boundary is podman-specific), OQ-10 (apple/container as a macOS backend — defer: macOS-26 + Apple-silicon-only, pre-1.0), OQ-11 (embedded microVM on Linux — v1 container-only, follow-up). Also folds the prior review passes' podman-version FATAL preflight (delta 4, OQ-8) and the doc-comment reconciliations.

Refs RIG-3139
Spec-impact: adds the embedded-mode revival design record (Draft) under docs/designs/ui/
Ledger-impact: DL-319/320/321 added; DL-235/237/238 flipped to Superseded
Co-authored-by: Matt Wilkinson <matt@rigel.build>
Base automatically changed from compass-obs/managed-boundary-naming-rule to main September 3, 2026 01:15
@trunk-io

trunk-io Bot commented Sep 3, 2026

Copy link
Copy Markdown

Merging to main in this repository is managed by Trunk.

  • To merge this pull request, check the box to the left or comment /trunk merge below.

After your PR is submitted to the merge queue, this comment will be automatically updated with its status. If the PR fails, failure details will also be posted here

mattwilkinsonn added a commit that referenced this pull request Sep 3, 2026
…sh macOS (RIG-3139) (#833)

Designs the reversal of the RIG-2542 client-only retirement: mode="embedded" returns to the Compass native app as the low-friction onboarding / local-dev front door, ADDED ALONGSIDE the fully-surviving client mode. The retirement's premise (the microVM Runner's KVM floor retiring local agent execution) is falsified now that podman is a permanent supported single-tenant tier per the trust-model boundary (DL-318, compass-obs #804). Covers the mode-selection contract, supervisor re-wire against the current stack, cross-OS preflight, bundle re-scope (sidecars return, postgres stays a DL-260 container), the macOS podman-machine provisioning spike, and the UI embedded boot arm.

Records the record on the ui/ design path (RIG-3113 dissolved product/ into ui/) and lands the ledger delta in DECISIONS.md: new rows DL-319 (dual-mode thesis), DL-320 (dual-mode app.toml), DL-321 (sidecar bundle sans postgres); status flips DL-235/237/238 → Superseded by DL-319/320/321. DL-236's standalone-compass-stack half stays Active.

Folds Matt's freeze-gate topology + backend feedback: the §Topology matrix separates the two independent axes (app mode: embedded/client; runner backend: podman/microVM) and records the recommended backend per funnel entry — embedded-local is podman-primary (macOS cannot do microVM; WSL2 has no KVM out of the box), self-host is microVM-recommended with podman the cost-sensitive tier, managed is microVM. Scrubs managed-hosted to the trust-model boundary only, with an OSS-core scope note keeping product-strategy specifics out of this repo. Adds three load-bearing open questions with recommendations for Matt's gate: OQ-9 (docker socket vs force-podman — force-podman: the --userns=keep-id:uid= isolation boundary is podman-specific), OQ-10 (apple/container as a macOS backend — defer: macOS-26 + Apple-silicon-only, pre-1.0), OQ-11 (embedded microVM on Linux — v1 container-only, follow-up). Also folds the prior review passes' podman-version FATAL preflight (delta 4, OQ-8) and the doc-comment reconciliations.

Refs RIG-3139
Spec-impact: adds the embedded-mode revival design record (Draft) under docs/designs/ui/
Ledger-impact: DL-319/320/321 added; DL-235/237/238 flipped to Superseded

Co-authored-by: Matt Wilkinson <matt@rigel.build>
@rigel-mintaka
rigel-mintaka force-pushed the compass-obs/rig-3070-runner-adoption-strategy branch 5 times, most recently from 841199d to e9def30 Compare September 4, 2026 19:12
rigel-mintaka added a commit that referenced this pull request Sep 4, 2026
…-3238)

ReviewDesign869 returned 1 high / 2 medium / 4 low on PR #869. Grounding
fidelity was clean (all code + cross-record citations verify at source);
these are ledger-collision and plan-completeness fixes. All folded; the two
mediums each also surface a load-bearing fork to Matt as a new OQ rather than
being decided here.

- HIGH (ledger collision): DL-326's Decision cell cited DL-325, an unlanded
  number double-claimed by #804 (RIG-3070) and #868 (RIG-2863). Since #868 is
  review-ready it may take DL-325 for an unrelated decision, and the cell is
  immutable after append. Re-cite the runner trust-model split by name+issue
  (RIG-3070 / PR #804), not the contested number, and add a Global Constraint
  ID-allocation + freeze-order note (mirroring the sibling embedded-revival
  record's GC6): re-grep main's ledger tail before landing, and the record
  does not depend on #804 landing first.
- MEDIUM (T-4 premise gap): removing podman-machine removes the Linux VM the
  runner runs IN on macOS today (compass-local-dev:194-205 ruled the runner
  runs INSIDE the VM), so apple-container forces the runner to run natively on
  darwin. Add a T-1(f) spike leg, an Approach reason-2 caveat, a T-4 scope
  note, and OQ-12 (load-bearing Matt fork: does a NO re-open adoption?).
- MEDIUM (T-2 podman surface): the stack has a second hard-coded podman shell
  (postgres_container.go:246-259 + collector_container.go:62) and ImageEnsurer
  is podman-hardwired at its production constructor (image.go:44-45). DL-260
  keeps postgres a rootless-podman container, so a macOS host still needs
  podman for the stack. Widen T-2's off-interface enumeration, concede the
  scoped "no machine" win in Approach reason 2, and add OQ-13 (Matt fork:
  postgres to apple-container, or --database-external as the macOS default?).
- LOW x4: nine-verbs wording (Resize is the ninth, not a tenth); image.go
  ImageExists citation span (:713, outside the cited :681-684); the
  OQ-1..OQ-4 gate carve-out for OQ-5's judgment call; DL-326 record link
  gains the §Approach anchor for the one-hop convention.

Checks: markdownlint 0 errors; design-ledger-gate OK (291 rows, 122 headers).
Status stays Draft — freezes Active on merge.

Refs RIG-3238
Co-authored-by: Matt Wilkinson <matt@rigel.build>
rigel-mintaka added a commit that referenced this pull request Sep 4, 2026
…-3238)

ReviewDesign869 returned 1 high / 2 medium / 4 low on PR #869. Grounding
fidelity was clean (all code + cross-record citations verify at source);
these are ledger-collision and plan-completeness fixes. All folded; the two
mediums each also surface a load-bearing fork to Matt as a new OQ rather than
being decided here.

- HIGH (ledger collision): DL-326's Decision cell cited DL-325, an unlanded
  number double-claimed by #804 (RIG-3070) and #868 (RIG-2863). Since #868 is
  review-ready it may take DL-325 for an unrelated decision, and the cell is
  immutable after append. Re-cite the runner trust-model split by name+issue
  (RIG-3070 / PR #804), not the contested number, and add a Global Constraint
  ID-allocation + freeze-order note (mirroring the sibling embedded-revival
  record's GC6): re-grep main's ledger tail before landing, and the record
  does not depend on #804 landing first.
- MEDIUM (T-4 premise gap): removing podman-machine removes the Linux VM the
  runner runs IN on macOS today (compass-local-dev:194-205 ruled the runner
  runs INSIDE the VM), so apple-container forces the runner to run natively on
  darwin. Add a T-1(f) spike leg, an Approach reason-2 caveat, a T-4 scope
  note, and OQ-12 (load-bearing Matt fork: does a NO re-open adoption?).
- MEDIUM (T-2 podman surface): the stack has a second hard-coded podman shell
  (postgres_container.go:246-259 + collector_container.go:62) and ImageEnsurer
  is podman-hardwired at its production constructor (image.go:44-45). DL-260
  keeps postgres a rootless-podman container, so a macOS host still needs
  podman for the stack. Widen T-2's off-interface enumeration, concede the
  scoped "no machine" win in Approach reason 2, and add OQ-13 (Matt fork:
  postgres to apple-container, or --database-external as the macOS default?).
- LOW x4: nine-verbs wording (Resize is the ninth, not a tenth); image.go
  ImageExists citation span (:713, outside the cited :681-684); the
  OQ-1..OQ-4 gate carve-out for OQ-5's judgment call; DL-326 record link
  gains the §Approach anchor for the one-hop convention.

Checks: markdownlint 0 errors; design-ledger-gate OK (291 rows, 122 headers).
Status stays Draft — freezes Active on merge.

Refs RIG-3238
Co-authored-by: Matt Wilkinson <matt@rigel.build>
rigel-mintaka added a commit that referenced this pull request Sep 4, 2026
…sign (RIG-3238)

ReviewDesign869r2 verified all 7 round-1 findings CLOSED but caught two
mediums the round-1 fold's own new prose introduced. Both are mechanical
text corrections with no design consequence.

- MEDIUM (guard-bullet facts): the ID-allocation/freeze-order Global
  Constraint bullet had wrong PR->DL attributions on every clause. Ground
  truth (verified via gh pr diff + main's ledger): main's tail ends at DL-324
  (landed by #870, merged); DL-325 is claimed by #804 (RIG-3070, draft) AND
  #859 (RIG-2863); DL-326 -- this record's own number -- is claimed by #859,
  which is review-ready (NOT draft). The bullet missed the real live collision
  (#859 on DL-326) and named #868 (which actually claims DL-327). Rewrote the
  factual clauses to match; kept the two correct load-bearing clauses (the
  MUST-re-grep-before-landing instruction and does-NOT-depend-on-#804). The
  immutable DL-326 cell was already merge-order-safe (name+issue cite), so
  this only corrected mutable prose.
- MEDIUM (unknown-count consistency): round-1 widened the ledger cell from
  five to six unknowns (adding runner-on-darwin / OQ-12) but left three "five"
  sites in the record body: the Why-STAGED enumeration, the reject-default
  alternative, and the T-1 task heading. Aligned all three to six + OQ-12, and
  aligned the threat classification (OQ-1, OQ-2, and OQ-12 threaten adoption)
  with the cell's widened re-open trigger.
- LOW: re-wrapped two range-overwrite orphan lines to the file's ~72-col width.

Checks: markdownlint 0 errors; design-ledger-gate OK (291 rows, 122 headers).
Status stays Draft -- freezes Active on merge.

Refs RIG-3238
Co-authored-by: Matt Wilkinson <matt@rigel.build>
@rigel-mintaka
rigel-mintaka force-pushed the compass-obs/rig-3070-runner-adoption-strategy branch from e9def30 to bb95c9e Compare September 4, 2026 20:21
…-3070)

Frozen-on-merge design record for the self-host runner topology and adoption strategy. The security boundary follows the trust model: untrusted multi-tenant operation requires the microVM hardware boundary; self-host single-tenant deployments keep podman as a permanent, supported entry tier (no /dev/kvm), microVM recommended not required; embedded-local mode revived as the cross-OS podman-backed developer front door (app-architecture reversal designed in the compass-native embedded-revival record).

Records DIRECTION only. When and how a hosted multi-tenant service sequences its move to microVM-only is a managed-plane rollout decision, out of scope here (docs/concepts/self-host-and-managed.md). Encodes DL-325.

Spec-impact: none. Refs RIG-3070

Co-authored-by: Matt Wilkinson <matt@rigel.build>
@rigel-mintaka
rigel-mintaka force-pushed the compass-obs/rig-3070-runner-adoption-strategy branch from bb95c9e to b640244 Compare September 4, 2026 21:38
@rigel-mintaka
rigel-mintaka marked this pull request as ready for review September 4, 2026 21:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant